package com.shujia

object Code15Object {
  var value:Int = 10


  def main(args: Array[String]): Unit = {
    fun(3)
    Code15Object.fun(4)
    println(Code15Object.value)

    /**
     *  ① object中定义的函数或者属性可以直接使用 类名称进行调用
     *  ② 当定义的class类名和object类名一致，那么称为当前object是class的伴生对象
     *  ③ 类的实例化可以在半生对象中添加 apply 函数，调用时，可以显示使用类名.apply() 也可以使用 类名()
     *       同时对于有参构造时，在apply() 中可以添加对于的参数
     *  ④ 对于静态代码块和构造代码块可以在类实例化之前对当前类对象进行做一些初始化工作
     *
     *        例如： 对于Mysql进行操作时，可以将Mysql的对象包装成自定义对象，在获取对象时，
     *        构造代码块：(创建一个对象，执行一次)
     *            可以在构造代码块中 可以创建一个连接对象  => 可以得到每一个自定义对象对应一个Mysql连接对象
     *        静态代码块：(执行一次)
     *            在静态代码块中，创建一个连接对象 => 可以得到一个全局的连接对象，供所有的自定义对象使用
     *
     *  ⑤ 对于构造方法私有可以直接在函数前加上private修饰
     */

    val code15Object2 = new Code15Object()
    val code15Object1 = new Code15Object()

//    val code15Object3: Code15Object = apply()

    println("**************************")
    // 省略new方式构建对象
    val code15Object5: Code15Object = Code15Object()

    val code15Object4: Code15Object = Code15Object("有参调用apply")

  }

  // 伴生对象中的代码调用，就是静态代码块
  println("这是半生对象中的函数调用...")

  def fun(a:Int): Unit = {
    println("get a：",a)
  }

  def apply(): Code15Object = {
    println("这是半生对象的apply方法，可以构建其类的对象进行返回")
    new Code15Object()
  }

  // apply方法的重载
  def apply(value:String): Code15Object = {
    println("这是半生对象的apply方法，可以构建其类的对象进行返回")
    new Code15Object(value)
  }


}

class Code15Object {
  // 构造代码块 每次构造对象都会执行
  println("当前的类对象正在构建....")

  var value:String = _

  def this(_value:String)  {
    this()
    value = _value
  }

}